package com.packet.cheng.test;

import java.util.concurrent.*;
  
class Message {  
    private int value;  
  
    public Message(int value) {  
        this.value = value;  
    }  
  
    public int getValue() {  
        return value;  
    }  
}  
  
class Producer implements Runnable {  
    private final BlockingQueue<Message> queue;  
  
    public Producer(BlockingQueue<Message> queue) {  
        this.queue = queue;  
    }  
  
    @Override  
    public void run() {  
        try {  
            for (int i = 1; i <= 100; i++) { // 生产100个消息，你可以根据需要修改这个数字
                Thread.sleep(1000); // 每秒生产10个消息，你可以根据需要修改这个数字
                queue.put(new Message(i)); // 当队列满时，put操作会阻塞等待  
            }  
        } catch (InterruptedException e) {  
            Thread.currentThread().interrupt();  
        }  
    }  
}  
  
class Consumer implements Runnable {  
    private final BlockingQueue<Message> queue;
    private final Integer uniqueId;


    public Consumer(BlockingQueue<Message> queue, Integer uniqueId) {
        this.queue = queue;
        this.uniqueId = uniqueId;
    }
  
    @Override  
    public void run() {  
        try {  
            while (true) { // 无限循环消费消息，你可以根据需要添加退出条件  
                Message message = queue.take(); // 当队列空时，take操作会阻塞等待  
                System.out.println("Consumer " + uniqueId + " consumed: " + message.getValue()); // 打印消费的消息内容到控制台
                Thread.sleep(1000); // 每秒消费1个消息，你可以根据需要修改这个数字
            }  
        } catch (InterruptedException e) {  
            Thread.currentThread().interrupt();  
        }  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        BlockingQueue<Message> queue = new LinkedBlockingQueue<>(100); // 创建一个长度为100的阻塞队列  
        Producer producer = new Producer(queue); // 创建生产者线程
        new Thread(producer).start(); // 启动生产者线程
         // 创建消费者线程
        int numConsumers = 20; // 创建20个消费者线程
        for (int i = 0; i < numConsumers; i++){
            new Thread(new Consumer(queue,i)).start(); // 启动消费者线程
        }
    }  
}